#使用matplotlib绘制洛伦兹吸引子曲线，使用ggplot样式和中文字体，在当前目录下保存图片为output.png

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import rcParams
from scipy.integrate import solve_ivp

# 设置 ggplot 样式
plt.style.use('ggplot')

# 设置中文字体
rcParams['font.sans-serif'] = ['SimHei']  # Windows 系统使用 SimHei
rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 定义洛伦兹方程
def lorenz(t, xyz, sigma, rho, beta):
    x, y, z = xyz
    dxdt = sigma * (y - x)
    dydt = x * (rho - z) - y
    dzdt = x * y - beta * z
    return [dxdt, dydt, dzdt]

# 参数设置
sigma = 10.0
rho = 28.0
beta = 8.0 / 3.0
initial_conditions = [1.0, 1.0, 1.0]  # 初始条件
t_span = (0, 50)  # 时间范围
t_eval = np.linspace(t_span[0], t_span[1], 10000)  # 时间点

# 求解洛伦兹方程
solution = solve_ivp(lorenz, t_span, initial_conditions, args=(sigma, rho, beta), 
                     t_eval=t_eval, method='RK45')

# 提取结果
x, y, z = solution.y

# 创建 3D 图形
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# 绘制洛伦兹吸引子
ax.plot(x, y, z, lw=0.5, color='blue')
ax.set_title('洛伦兹吸引子', fontsize=16)
ax.set_xlabel('X 轴', fontsize=14)
ax.set_ylabel('Y 轴', fontsize=14)
ax.set_zlabel('Z 轴', fontsize=14)

# 保存图片到当前目录
# output_path = 'output.png'
output_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'output.png')

plt.savefig(output_path, dpi=300, bbox_inches='tight')
print(f"图片已保存到: {output_path}")

# 显示图形
plt.show()
